package com.cxt.interceptor;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cxt.entity.TripOrder;
import com.cxt.entity.User;
import com.cxt.properties.JwtProperties;
import com.cxt.result.Result;
import com.cxt.service.ITripOrderService;
import com.cxt.service.IUserService;
import com.cxt.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class PDInterceptor implements HandlerInterceptor {
    @Autowired
    private JwtProperties jwtProperties;
    @Autowired
    private IUserService userService;
    @Autowired
    private ITripOrderService tripOrderService;
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      //获取用户ID

        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法，直接放行
            return true;
        }
        //1、从请求头中获取令牌
        String token = request.getHeader(jwtProperties.getUserTokenName());
        //2、校验令牌
        try {
            log.info("jwt校验:{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
            Long userId = Long.valueOf(claims.get(jwtProperties.getUserIdName()).toString());
            log.info("当前用户的id：{}", userId);
            //获取该用户的id
            LambdaQueryWrapper<TripOrder> wtr =  new LambdaQueryWrapper<>();
            wtr.eq(TripOrder::getUserId, userId);
            wtr.eq(TripOrder::getPaymentStatus, 0);
            if(tripOrderService.count(wtr) > 0){
                Result<String> result = Result.error("您有未完成订单，请前往订单页完成订单");
                String jsonString = JSON.toJSONString(result);
                // 设置响应格式
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().write(jsonString);
                return false;
            }
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(User::getId, userId);
            User user = userService.getOne(wrapper);
            if(user.getIsDriver()){
                return true;
            }
            if(user.getIsBoundStudentInfo() == null ||!user.getIsBoundStudentInfo()){
                Result<String> result = Result.error("您未绑定学生信息，请前往个人页绑定学生信息");
                String jsonString = JSON.toJSONString(result);
                // 设置响应格式
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().write(jsonString);
                return false;
            }
            return true;
        } catch (Exception ex) {
            Result<String> result = Result.error("notLogin");
            String jsonString = JSON.toJSONString(result);
            response.getWriter().write(jsonString);
            //设置响应格式
            response.setContentType("application/json;charset=utf-8");
            return false;
        }
    }
}
